package com.auction.websocket;

import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * WebSocket服务器
 */
@Slf4j
@Component
@ServerEndpoint("/websocket/{userId}")
public class WebSocketServer {
    // 存放所有在线的客户端
    private static final Map<String, Session> clients = new ConcurrentHashMap<>();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        clients.put(userId, session);
        log.info("有新的连接加入：{}，当前在线人数为：{}", userId, clients.size());
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("userId") String userId) {
        clients.remove(userId);
        log.info("有一连接关闭：{}，当前在线人数为：{}", userId, clients.size());
    }

    /**
     * 收到客户端消息后调用的方法
     */
    @OnMessage
    public void onMessage(String message, @PathParam("userId") String userId) {
        log.info("收到来自客户端{}的消息：{}", userId, message);
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误", error);
    }

    /**
     * 发送消息
     * 
     * @param userId
     * @param message
     */
    public static void sendMessage(String userId, String message) {
        Session session = clients.get(userId);
        if (session != null && session.isOpen()) {
            try {
                session.getBasicRemote().sendText(message);
                log.info("消息发送成功：{} -> {}", message, userId);
            } catch (IOException e) {
                log.error("消息发送失败", e);
            }
        }
    }

    /**
     * 群发消息
     * 
     * @param message
     */
    public static void broadcastMessage(String message) {
        clients.forEach((userId, session) -> {
            if (session.isOpen()) {
                try {
                    session.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    log.error("群发消息失败", e);
                }
            }
        });
        log.info("群发消息发送成功：{}", message);
    }

    /**
     * 发送给拍卖品的订阅者
     * 
     * @param auctionId
     * @param message
     */
    public static void sendToAuctionSubscribers(Long auctionId, String message) {
        // 实际项目中，可以使用Redis维护订阅关系
        log.info("发送拍卖品{}消息：{}", auctionId, message);
    }
}